(for Internet Explorer)
ParentProcess オブジェクトのメンバー
Class  ParentChildProcess
  Public  m_OutFile 'as TextStream (Write) ... 子プロセスへ渡す XML ファイル
  Public  m_InXML 'as IXMLDOMElement ... メイン・プロセスに戻される ルートXML要素

  Public  m_TempPath ' as string. 送受信ファイルができるフォルダのパス
  Public  m_DateID ' as string. 例:"090401". /ChildProcess オプションに渡す値
  Public  m_FileID ' as string. 例:"1". /ChildProcess オプションに渡す値
End Class
  sample.Name = "A" : sample.Value = 1

  '// 子プロセス起動前に、送るオブジェクトをXMLファイルに変換する
  Dim  pr : new_ParentProcess_Object  pr, Empty '//[out] pr as ParentChildProcess
  pr.m_OutFile.WriteLine  sample.xml


  '// 子プロセスを起動する
  Dim r : r= RunProg( "cscript.exe T_ChildProcess1_Sub.vbs", pr )
  CheckTestErrLevel  r


  '// 子プロセス終了後に、戻されたXMLファイルをオブジェクトに戻す
  sample.loadXML  pr.m_InXML.selectSingleNode( _
    TypeName( sample ) +"[@name='"+ sample.Name +"']" )
使用サンプル:
子プロセスに、データを受け渡しするときは、new_ParentProcess_Object で生成した
ParentProcess オブジェクトを RunProg に渡します。
new_ParentProcess で生成した ParentProcess オブジェクトには、他の子プロセスと受け渡し
するファイルの名前が重複しない番号が m_FileID に入っています。 複数の子プロセスを
平行して同時に動かすときは、ParentProcess オブジェクトをもう1つ生成してください。
前の子プロセスが終わってから次の子プロセスを動かすときは、同じ ParentProcess
オブジェクトが使えます。
(src)
pr
vbs_inc モジュールは、vbslib をインクルードする前に自動的に /ChildProcess オプションがあるかどうかを
判定し、あれば ChildProcess オブジェクトを生成します。 ChildProcess オブジェクトは、get_ChildProcess
  Dim  pr, sample

  '// プログラム開始時に、送られてきたXMLファイルをオブジェクトに戻す
  Set pr = get_ChildProcess()  ' as ParentChildProcess
  new_ObjectFromStream  sample, "SampleClass", pr


  '// main
  If not IsEmpty( sample ) Then
    sample.Value = 2
  End If


  '// プログラム終了時に、戻すオブジェクトをXMLファイルに変換する
  If not pr is Nothing Then
    If not IsEmpty( sample ) Then  pr.m_OutFile.WriteLine  sample.xml
  End If
であり、メインプロセスからの情報を m_InXML から入力し、
関数で取得できる
ChildProcess オブジェクトのメンバー
使用サンプル:
Class  ParentChildProcess
  Public  m_InXML 'as IXMLDOMElement ... メイン・プロセスから渡される ルートXML要素
  Public  m_OutFile 'as TextStream (Write) ... メイン・プロセスへ戻す XML ファイル

  Public  m_TempPath ' as string. 送受信ファイルができるフォルダのパス
  Public  m_DateID ' as string. 例:"090401". ファイル名の一部
  Public  m_FileID ' as string. 例:"1". ファイル名の一部
End Class
メインプロセスへ戻す情報を、m_OutFile に出力することができます。

/ChildProcess オプションがないときは、get_ChildProcess 関数が、Nothing オブジェクトを返します。
参考
→ XPath
(src)
Class  InterProcessData  '// defined_as_interface
  Public Sub  OnCallInParent( a_ParentProcess as ParentChildProcess ) : End Sub
  Public Sub  loadXML( XmlObject as IXMLDOMElement ) : End Sub
  Public Sub  OnReturnInChild( a_ChildProcess as ParentChildProcess ) : End Sub
  Public Sub  OnReturnInParent( a_ParentProcess as ParentChildProcess ) : End Sub
End Class

Function  new_InterProcessData()
  Set new_InterProcessData = new InterProcessData
End Function
→ T_ChildProcess2_include.vbs
テスト
ライブラリが自動的に子プロセスに受け渡しをするオブジェクトに必要なインターフェースです。
Err2 は、このインターフェースを持っています。
Dim  g_Sample

Sub  InitializeModule_Sample  '// vbslib モジュールのグローバル・初期化関数
  '// NewChildProcessOnStart の後で
  new_ObjectFromStream  g_Sample, "SampleClass", get_ChildProcess()
  If not IsEmpty( g_Sample ) Then  g_InterProcess.m_Data.Add  g_Sample
End Sub
→ T_ChildProcess2.vbs
参考
参考
→ T_ChildProcess2_Sub.vbs
  '// 子プロセスと送受信するオブジェクトを登録する
  Dim sample : Set sample = new SampleClass  '// has_interface_of InterProcessData
  g_InterProcess.m_Data.Add  sample
子プロセスに渡すオブジェクトは、g_InterProcess.m_Data as ArrayClass に登録してください。
子プロセスのライブラリの初期化(vbslib モジュールのグローバル・初期化関数)で、
get_ChildProcess as ParentChildProcess から、new_ObjectFromStream などを使って、
オブジェクトを受け取ってください。 メイン・プロセスに渡すオブジェクトは、
g_InterProcess.m_Data as ArrayClass に登録してください。
参考
→ T_ChildProcess2.vbs
ライブラリのデータを格納後、g_InterProcess のデータを格納直前に、
+1されます。
(src)
Dim  g_InterProcess ' as InterProcess

Class InterProcess
  Public Property Get  ProcessCallID   '// as ArrayClass of integer
  Public               InterProcessUserData  '// as string
End Class
メイン・プロセスと子プロセスで共有する変数です。
.ProcessCallID  ' as ArrayClass of integer
ProcessCallID(0) = メイン・プロセスが子プロセスを起動した回数。
ProcessCallID(1) = 子プロセスが孫プロセスを起動した回数。
.InterProcessUserData as string
アプリケーション・ユーザーがデバッグ用に使えます
テスト
受け渡しの内容を確認するには
%Temp%\Report\090401\ChildProcess_1\In.xml
%Temp%\Report\090401\ChildProcess_1\Out.xml
下記の XML ファイルを確認してください。
ただし、ParentProcess オブジェクトが削除されたら、XML ファイルも削除されるので注意してください。
参考
アプリケーションからデータが送れない
RunProg の第2引数に、ParentProcess オブジェクトを指定しているか確認してください。
Function  GetCScriptGUI_CommandLine( Parameters as string ) as string
ダブルクリックしたときに、vbslib のコマンド・プロンプトを開くコマンドラインを返します。
【引数】
Parameters
cscript.exe に渡すパラメーター
コマンドライン
返り値
サンプル
command_line = GetCScriptGUI_CommandLine( "sample.vbs" )
Assert  command_line = _
    """%windir%\System32\cmd.exe"" /K (""%windir%\SysWOW64\cscript.exe"" sample.vbs)"
Windows のバージョンによって、返り値の内容は変わります。
(src)
環境変数を展開するときは、
Sub  OpenFolder( in_FolderOrFilePath )
【引数】
in_FolderOrFilePath
フォルダー、またはファイルのパス
フォルダーを開きます。 フォルダーがなければユーザーに処理を選ばせます。
フォルダーを開く処理は、OpenFolder 関数の内部から
を呼び出すことで行います。
in_FolderOrFilePath 引数の親フォルダーがあれば、そのフォルダーを開きます。
親フォルダーがなければ、以下のメニューを開きます。
"C:\Folder\Sub\File.txt" が見つかりません。
  1. フォルダーを作る C:\Folder\Sub\File.txt
  2. フォルダーを作る C:\Folder\Sub
  3. フォルダーを開く C:\Folder
  9. 続きを実行する
番号>
ソース
テスト
関連
→ vbslib.vbs
→ T_OpenFolder_Manually.vbs
Function  GetEditorCmdLine( PathAndFragment as string ) as string
【引数】
PathAndFragment
返り値
テキストファイルへのパスと行番号またはキーワード
コマンドライン
サンプル:
start  GetEditorCmdLine( "File1.txt#[Func1]" )
File1.txt を開いて "[Func1]" を含む行にジャンプします
テキストファイルを開くエディタは、
関数を定義することで変更でき
ます。 Setting_getEditorCmdLine の i=2、i=3 のどちらかに対応すれば、指定の行へジャンプ
できます。 i=0、i=1 のどちらかに対応していれば、ファイルを開くことだけはできます。
関連
GetSearchOpenCmdLine は廃止予定です。 GetEditorCmdLine を使ってください。
サンプル:
start  GetEditorCmdLine( "File1.txt(10)" )
サンプル:
start  GetEditorCmdLine( "File1.txt" )
File1.txt を開きます
File1.txt の10行目を開きます
の設定が反映されます。
テキスト・エディターを起動するコマンドラインを返します。
start  GetEditorCmdLine( "File1.txt:10" )
start  GetEditorCmdLine( "File1.txt:[Func1]" )
Function  GetSearchOpenCmdLine( PathAndFragment as string ) as string
参考
PathAndFragment には、タグジャンプ形式の文字列(パス+行番号、または、パス+行内容)
を指定できます。 形式については下記のサンプルを参照してください。
キーワードの直前の文字がコロン ( : ) のときは、数字のみのキーワードを指定できません。
返り値に含まれるファイル・パスは、フル・パスになります。
(廃止予定)
タグジャンプ形式のパスの解析
フォルダーを開く
(廃止予定)
ソース
→ T_Path.vbs
テスト
T_GetEditorCmdLine
→ vbslib.vbs
File1.txt を開いて "Func1" を行末に含む行にジャンプします
サンプル:
start  GetEditorCmdLine( "File1.txt#Func1${\n}" )
サンプル:
File1.txt を開いて "Func1" を2番目に含む行にジャンプします
start  GetEditorCmdLine( "File1.txt#Func1${+2}" )
\n は、C言語の改行の表現と同じです。
${ } は、
の表現と同じです。
拡張子が pdf で a.pdf#page=2 のように path を指定すると、Internet Explorer で指定した
ページが開きます。(Internet Explorer の設定変更や仕様変更により使えなくなる可能性が
あります。)
${\n}
${+number}
#string
:string
#number
:number
Function  GetDiffCmdLine( PathA as string, PathB as string ) as string
(src)
Diff ツール(比較するプログラム)を起動するコマンドラインを返します。
の設定によって変わります。
start  GetDiffCmdLine( "file1.txt", "file2.txt" )
返り値の例:
"C:\Program Files\Diff.exe" "C:\FileA.txt" "C:\FileB.txt"
Function  GetDiffCmdLine3( PathA as string, PathB as string, PathC as string ) as string
start  GetDiffCmdLine( "file1.txt(5)", "file2.txt" )
file1.txt の 5行目と、それに対応する file2.txt を表示する
start  GetDiffCmdLine3( "file1.txt", "file2.txt", "file3.txt" )
file1.txt、file2.txt、file3.txt を表示する
設定されている Diff ツールが行番号指定に対応していないときは、5行目ではなく先頭の
行を表示します。
設定されている Diff ツールが3つのファイルを同時に比較することができないときは、
3つのファイルのうち、比較する2つのファイルを選択するスクリプト diff3to2.vbs を
起動するコマンドラインを返します。
サンプル
サンプル
サンプル
サンプル
  Dim  folder_a,  folder_b,  step_path

  folder_a = "C:\folder_a\"
  folder_b = "C:\folder_b\"

  Do
    echo  ""
    echo  "2つのフォルダーの中にあるテキストファイルを Diff で表示します"
    echo  folder_a
    echo  folder_b
    echo  ""
    echo  "Enter のみ : 終了"
    step_path = input( "共通の相対パス >" )
    If step_path = "" Then  Exit Do

    start  GetDiffCmdLine( GetFullPath( step_path, folder_a ), _
                           GetFullPath( step_path, folder_b ) )
  Loop
相対パスを1つ入力して、Diff を開くプロンプト
参考
サンプル
start  GetDiffCmdLine( "folder1", "folder2" )
ファイルのパスが指定されたときに起動するツールは、
の設定によって
変わります。
フォルダーのパスが指定されたときに起動するツールは、
テキスト ファイルを比較するツールを起動する。
フォルダーを比較するツールを起動する。
Function  GetDiffCmdLine3Ex( PathA as string, PathB as string, PathC as string,
    in_Option  as Empty or DiffCmdLineOptionClass ) as string
.IsComparing(i)
(i+1) 番目のフォルダーを比較するかどうか。
初期値は True。
3つのパスは指定するけど、そのうち一部だけ比較する
ときは、比較しないフォルダーについて False にします。
boolean
に指定するオプション。
Function  GetDiffStringCmdLine( StringA as string, StringB as string )
    as DiffCmdLineClass
Diff ツールを起動して、文字列を比較するコマンドラインを返します。
Function  GetDiffStringCmdLine3( StringA as string, StringB as string, StringC as string )
    as DiffCmdLineClass
との違いは、引数が比較する内容の文字列であることです。
start  GetDiffStringCmdLine( "ABC", "AxC" )
サンプル
【引数】
StringA
StringB
比較する文字列 A
比較する文字列 B
StringC
比較する文字列 C
コマンドラインの文字列、または、
返り値
サンプル
Set diff_ = GetDiffStringCmdLine( "ABC", "AxC" )
RunProg  diff_, ""
Pause
diff_.Remove
Diff ツールを開き、Diff ツールを閉じたら一時的に作成されるファイルを削除する
関連
ソース
→ TestScript.vbs
Default Property Get  DiffCmdLineClass::CmdLine() as string
Sub  DiffCmdLineClass::Remove()
Diff ツールを起動して、文字列を比較するコマンドライン。
比較する文字列が入ったファイルを削除します。
Dim  DiffCmdLineClass::PathA as string
Dim  DiffCmdLineClass::PathB as string
Dim  DiffCmdLineClass::PathC as string
比較する文字列 A が入ったファイルのパス。
比較する文字列 B が入ったファイルのパス。
Empty または、比較する文字列 C が入ったファイルのパス。
ソース
→ TestScript.vbs
参考
ソース
→ TestScript.vbs
Function  GetDiffOneLineCmdLine( in_PathAndLineNumA as string, in_PathAndLineNumB as string )
    as DiffCmdLineClass
Diff ツールを起動して、指定した行を 1文字ずつ比較するコマンドラインを返します。
【引数】
in_PathAndLineNumA
in_PathAndLineNumB
比較するファイルのパスと行番号、または、比較する文字列
比較するファイルのパスと行番号、または、比較する文字列
返り値
コマンドラインの文字列、または、
start  GetDiffOneLineCmdLine( "FileA.txt(3)", "FileB.txt(4)" )
サンプル
サンプル
Set diff_ = GetDiffOneLineCmdLine( "FileA.txt(3)", "FileB.txt(4)" )
RunProg  diff_, ""
Pause
diff_.Remove
Diff ツールを開き、Diff ツールを閉じたら一時的に作成されるファイルを削除する
テスト
→ T_fc.vbs
T_GetDiffOneLineCmdLine
関連
ファイルの比較ではなく、文字列を比較するときは、要素数1の配列を渡します。
start  GetDiffOneLineCmdLine( Array( "Yes, it is." ),  Array( "Yes, it was." ) )
サンプル
Sub  DiffCUI( FilePaths as array of string, FileLabels as array of string )
Diff ツールがないときに、コマンドラインだけで使える比較ツール。
【引数】
FilePaths
FileLabels
比較するファイル パスの配列
比較するファイルの役割名の配列
関連
テスト
ソース
→ vbslib.vbs
→ T_SyncFiles.vbs
Diff ツールで開くファイルのパスをテストでチェックするとき
DiffCUI は、比較しているそれぞれのファイルを開くメニューがあり、
方法と組み合わせれば、Diff ツールで開くファイルのパスをチェックできます。
→ _src\Test\tools\T_SyncFiles\SettingForTest.vbs
参考
 1. 差分を調べて、結果をテキスト・エディターで開く
 4. 01 のファイルを開く
 5. 02 のファイルを開く
 *. 03 のファイルは、存在しません
 **. コピーする(コピー元(4以上)×10+コピー先(4以上)
     例:45 = 01 → 02
 99. 戻る
操作の番号を入力してください >
本関数を呼び出すと、以下のように表示されます。
を指定して、
を呼び出すために経由する関数。
Function  DiffCUI_InCurrentProcess( CommandLine as string )
ソース
→ PC_setting_default.vbs
>start  \?InCurrentProcessFunc\DiffCUI_InCurrentProcess -i=33 "C:\Folder\01" "C
:\Folder\02" "C:\Folder\03"
-------------------------------------------------------------------------------
 1. 差分を調べて、結果をテキスト・エディターで開く
 4. 01 のファイルを開く
 5. 02 のファイルを開く
 *. 03 のファイルは、存在しません
 **. コピーする(コピー元(4以上)×10+コピー先(4以上)
     例:45 = 01 → 02
 99. 戻る
操作の番号を入力してください >
start に本関数の返り値を指定すると、以下のように表示されます。
Sub  Sleep( msec as integer )
指定した時間だけ待ちます。
【引数】
msec
待つ時間(ミリ秒)
(src)
  Sleep  1000
サンプル:
  Dim  n : For n = 5 To 1 Step -1 : echo  n : Sleep  1000 : Next : echo  0
サンプル:
5秒のカウントダウン
関連
Function  WaitForFile( Path as string ) as string
指定したファイルが作られるまで待ちます。
【引数】
Path
待つファイルのパス
何かの処理(前処理)が終わってから行う処理があるときに使います。
前処理が終わるときに、終わったことを示すファイルを作るようにすれば、
本関数が使えるようになります。
(src)
返り値
ファイルの1行目の内容(末尾に改行文字なし)
本関数から抜ける直前で、対象のファイルを削除します。
  WaitForFile  "Result.txt"
サンプル:
複数のプロセスで通信をするときは、同期に使用するファイルを最終的に
削除する責任を持つ
形にしてください。 そうしないと、同期に使用するファイルを相手に通知する
前に削除してしまう可能性が生まれて、サブ・スレッドが永遠に待ち続ける
ことになってしまいます。
関連
サブ・スレッド (サーバー)
起動
WaitForFile
CreateFile
WaitForFile
CreateFile で終えると
(busy)
delete
待ち続ける...
終了
通信の注意
ホスト側が WaitForFile で待って通信を終える
メイン・スレッド (クライアント)
同期に使うファイルは、2つのスレッド(クライアントとサーバー)で別のファイル名にしてください。
そうしないと、自分が作成(送信)したファイルを待つ(受信する)形になり、待たないことに
なってしまうからです。
送信ファイルを作成する前に、受信したファイルを削除してください。
そうしないと、相手が次の受信ファイルを先に作ってしまい、そのファイルを削除してしまう
からです。 また、前の通信の残りがあるときでも正しく動くように、クライアントは、前の受信
ファイルを削除してから、送信ファイルを作成してください。
→ T_Call_Target.vbs # [T_WaitForFile]
テスト
→ FileT_wait (clib)
エラーを発生させるファイルを作る
WaitForFile で待っているファイルが、XML 形式のテキストで、ルートのタグが <ERROR>
のときは、WaitForFile の内部からエラーを発生させます。
<?xml version="1.0" encoding="Shift_JIS"?>
<ERROR num="3" msg="エラー"/>
作成するファイルの例
上記の場合、Err オブジェクトの内容は、次のようになります。
Assert  Err.Number = 3
Assert  Err.Description = "<ERROR num=""3"" msg=""エラー""/>"
→ OnTime (Excel)